<?php

require_once(SERVER_ROOT . '/authenticate/' . 'Authenticator.php');
require_once(SERVER_ROOT . '/utils/' . 'MYSQLAdapter.php');

class ClienteDAO {

	private $_STATUS_ATIVO = 1;
	private $_STATUS_INATIVO = 0;
	private $_ERRO = 0;
	private $_SUCESSO = 1;
	private $_ERROR_REMOVE_CLIENT = 2;
	private $_SUCESSO_REMOVE_CLIENT = 3;
	private $adapter;
	private $usuario;

	public function __construct() {
		$this->adapter = new MYSQLAdapter($GLOBALS['config']);
		$this->usuario = Authenticator::getUser();
	}

	public function save(array $cliente) {
		$data = array(
				'id_escritorio' => $cliente['id_escritorio'], 'nome' => $cliente['nome'], 'endereco' => $cliente['endereco'], 'cidade' => $cliente['cidade'], 'estado' => $cliente['estado'], 'cep' => $cliente['cep'], 'telefone_fixo' => $cliente['telefone_fixo'], 'telefone_movel' => $cliente['telefone_movel'], 'email' => $cliente['email'], 'data_nascimento' => $cliente['data_nascimento'], 'profissao' => $cliente['profissao'], 'estado_civil' => $cliente['estado_civil'], 'rg' => $cliente['rg'], 'cpf' => $cliente['cpf'], 'status' => $cliente['status']);
		$id_cliente = $this->adapter->insert("tb_cliente", $data);
		if ($id_cliente) {
			return $this->_SUCESSO;
		}
		return $this->_ERRO;
	}

	public function activateClienteById($id_cliente) {
		$data_update = array('status' => $this->_STATUS_ATIVO);
		$this->adapter->update("tb_cliente", $data_update, "id_cliente = '$id_cliente'");
	}

	public function inactivateClienteById($id_cliente) {
		$data_update = array('status' => $this->_STATUS_INATIVO);
		$this->adapter->update("tb_cliente", $data_update, "id_cliente = '$id_cliente'");
	}

	public function desassociateClienteProcesso($id_processo, $id_cliente) {
		$this->adapter->delete("tb_processo_cliente", "id_cliente = '$id_cliente' AND id_processo = '$id_processo'");
	}

	public function associarClienteProcesso($id_processo, $cpf_cliente) {
		$cliente = $this->findByCPF($cpf_cliente);
		$id_cliente = $cliente['id_cliente'];
		$data_cliente = array('id_cliente' => $id_cliente, 'id_processo' => $id_processo);
		$this->adapter->insert("tb_processo_cliente", $data_cliente);
	}

	public function countByOffice($id_escritorio) {
		$this->adapter->select("tb_cliente", "tb_cliente.id_escritorio = $id_escritorio");
		return $this->adapter->getAffectedRows();
	}

	public function count() {
		$this->adapter->select("tb_cliente", "status = 1");
		return $this->adapter->getAffectedRows();
	}
	public function countAllByEscritorio($id_escritorio) {
		$this->adapter->select("tb_cliente", "id_escritorio = '$id_escritorio'");
		return $this->adapter->getAffectedRows();
	}

	public function findById($id) {
		$this->adapter->select("tb_cliente", "id_cliente = '$id'");
		return $this->adapter->fetch();
	}

	public function findByCPF($cpf) {
		$this->adapter->select("tb_cliente", "cpf = '$cpf'");
		return $this->adapter->fetch();
	}

	public function removeById($id) {
		$this->adapter->select("tb_processo_cliente", "id_cliente = '$id'");
		$result = $this->adapter->countRows();
		if ($result) {
			return $this->_ERROR_REMOVE_CLIENT;
		} else {
			$affectedRows = $this->adapter->delete("tb_cliente", "id_cliente = '$id' ");
			if ($affectedRows) {
				return $this->_SUCESSO_REMOVE_CLIENT;
			}
		}
	}

	public function update(array $cliente) {
		$id = $cliente['id_cliente'];
		$data = array('nome' => $cliente['nome'], 'endereco' => $cliente['endereco'], 'cidade' => $cliente['cidade'], 'estado' => $cliente['estado'], 'cep' => $cliente['cep'], 'telefone_fixo' => $cliente['telefone_fixo'], 'telefone_movel' => $cliente['telefone_movel'], 'email' => $cliente['email'], 'data_nascimento' => $cliente['data_nascimento'], 'profissao' => $cliente['profissao'], 'estado_civil' => $cliente['estado_civil'], 'rg' => $cliente['rg'], 'cpf' => $cliente['cpf'], 'status' => $this->_STATUS_INATIVO);
		return $this->adapter->update("tb_cliente", $data, "id_cliente = '$id'");
	}

	public function findAllByStatusActivate($sidx, $sord, $start, $limit) {
		$this->adapter->select("tb_cliente,status = '$this->_STATUS_ATIVO'
				ORDER BY $sidx $sord LIMIT $start, $limit");
		return $this->adapter->fetchAllByFilter('client', array('cpf'));
	}

	public function findAllStatusPendency() {
		$this->adapter->select("tb_cliente", "status = 0");
		$row = $this->adapter->fetchAllByFilter('client', array('cpf'));
		return $row;
	}

	public function findAll($sidx, $sord, $start, $limit) {
		$this->adapter->select("tb_cliente", "1=1
				ORDER BY $sidx $sord LIMIT $start, $limit");
		return $this->adapter->fetchAllByFilter('Client', array(''));
	}

	public function findAllByEscritorio($sidx, $sord, $start, $limit) {
		$id_escritorio = $this->usuario->id_escritorio;
		$this->adapter->select("tb_cliente", "id_escritorio = '$id_escritorio'
				ORDER BY $sidx $sord LIMIT $start, $limit");
		return $this->adapter->fetchAllByFilter('Client', array(''));
	}

	public function findAllByEscritorioWithFilters($sidx, $sord, $start, $limit, $search_field, $search_string, $search_oper) {
		$id_escritorio = $this->usuario->id_escritorio;
		if ($search_oper == 'eq') {
			$this->adapter->select("tb_cliente", "id_escritorio = '$id_escritorio' and $search_field = '$search_string'
					ORDER BY $sidx $sord LIMIT $start, $limit");
			return $this->adapter->fetchAllByFilter('Client', array(''));
		} else {
			$this->adapter->select("tb_cliente", "id_escritorio = '$id_escritorio' and $search_field like '%$search_string%'
					ORDER BY $sidx $sord LIMIT $start, $limit");
			return $this->adapter->fetchAllByFilter('Client', array(''));
		}
	}

	public function findAllWithFilters($sidx, $sord, $start, $limit, $search_field, $search_string, $search_oper) {
		if ($search_oper == 'eq') {
			$this->adapter->select("tb_cliente", "$search_field = '$search_string' and
					ORDER BY $sidx $sord LIMIT $start, $limit");
			return $this->adapter->fetchAllByFilter('Client', array(''));
		} else {
			$this->adapter->select("tb_cliente", "$search_field like '%$search_string%'
					ORDER BY $sidx $sord LIMIT $start, $limit");
			return $this->adapter->fetchAllByFilter('Client', array(''));
		}
	}

	public function findAllByIdProcesso($id_processo, $sidx, $sord, $start, $limit) {
		$this->adapter->select("tb_processo_cliente", "id_processo = '$id_processo'");
		$rows = $this->adapter->fetchAllByFilter('ProcessoCliente', array(''));

		$ids = '';
		if (sizeof($rows) == 1) {
			$processo_cliente = $rows[0];
			$id = $processo_cliente['id_cliente'];
			$ids = "id_cliente = $id";
		} else {
			for ($i = 0; $i < sizeof($rows); $i++) {
				if ($i != sizeof($rows) - 1) {
					$processo_cliente = $rows[$i];
					$id = $processo_cliente['id_cliente'];
					$ids = $ids . "id_cliente = $id OR ";
				} else {
					$processo_cliente = $rows[$i];
					$id = $processo_cliente['id_cliente'];
					$ids = $ids . "id_cliente = $id";
				}
			}
		}
		$this->adapter->select("tb_cliente", " $ids
				ORDER BY $sidx $sord LIMIT $start, $limit");
		return $this->adapter->fetchAllByFilter('Client', array(''));
	}

	public function findAllByIdProcessoWithFilters($id_processo, $sidx, $sord, $start, $limit, $search_field, $search_string, $search_oper) {
		$this->adapter->select("tb_processo_cliente", "id_processo = '$id_processo'");
		$rows = $this->adapter->fetchAllByFilter('ProcessoCliente', array(''));

		$ids = '';
		if (sizeof($rows) == 1) {
			$processo_cliente = $rows[0];
			$id = $processo_cliente['id_cliente'];
			$ids = "id_cliente = $id";
		} else {
			for ($i = 0; $i < sizeof($rows); $i++) {
				if ($i != sizeof($rows) - 1) {
					$processo_cliente = $rows[$i];
					$id = $processo_cliente['id_cliente'];
					$ids = $ids . "id_cliente = $id OR ";
				} else {
					$processo_cliente = $rows[$i];
					$id = $processo_cliente['id_cliente'];
					$ids = $ids . "id_cliente = $id";
				}
			}
		}
		if ($search_oper == 'eq') {
			$this->adapter->select("tb_cliente", " $ids AND $search_field = '$search_string'
					ORDER BY $sidx $sord LIMIT $start, $limit");
		} else {
			$this->adapter->select("tb_cliente", " $ids AND $search_field like '%$search_string%'
					ORDER BY $sidx $sord LIMIT $start, $limit");
		}
		return $this->adapter->fetchAllByFilter('Client', array(''));
	}

	public function findClienteAutoComplete($term) {
		$this->adapter->select("tb_cliente", "cpf LIKE '%$term%'", "cpf");
		return $this->adapter->fetchAllByFilter('Client', array('id_cliente' => 'id_cliente', 'id_escritorio' => 'id_escritorio', 'nome' => 'nome', 'endereco' => 'endereco', 'cidade' => 'cidade', 'estado' => 'estado', 'cep' => 'cep', 'telefone_fixo' => 'telefone_fixo', 'telefone_movel' => 'telefone_movel', 'email' => 'email', 'data_nascimento' => 'data_nascimento', 'profissao' => 'profissao', 'estado_civil' => 'estado_civil', 'rg' => 'rg', 'status' => 'status'));
	}

}
